|
[22 May 2012|11:41am] |
Декоратор для статических переменных.def withstatic(**kwargs):
def helper(f):
def wrapper(*args):
for vn,vv in kwargs.iteritems():
if not hasattr(wrapper, vn):
setattr(wrapper, vn, vv)
f(*args)
return wrapper
return helper
Пример:
@withstatic(x=-1)
def f(y):
print 'x = %d, y = %d' % (f.x, y)
f.x = y
for y in range(10):
f(y)
Вывод:# ./t.py
x = -1, y = 0
x = 0, y = 1
x = 1, y = 2
x = 2, y = 3
x = 3, y = 4
x = 4, y = 5
x = 5, y = 6
x = 6, y = 7
x = 7, y = 8
x = 8, y = 9
Костыль? Велосипед? Боян? А как правильно?
PS. Хотелось бы еще избавится от необходимости писать function_name.variable_name.
|
|
| распарсить и изменить части url |
[18 Apr 2012|04:41pm] |
Нужно взять URL и заменить некоторые части, для того что бы показать пользователю в красивом виде. Проблема в том, что бы собрать url из кусков обратно.
Например,
http://xn--80a1acny.xn--p1ai/resp_engine.aspx?Path=RP/INDEX/RU/Home/Search&keyword=%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82 в http://почта.рф/resp_engine.aspx?Path=RP/INDEX/RU/Home/Search&keyword=привет
URL легко распарсить при помощи urlparse.urlsplit. Дальше я в try/except заменяю host.decode('idna').encode('UTF-8') и query = urllib.unquote_plus(query).decode('UTF-8').encode('UTF-8')
Проблема в том, что urlparse позволяет распарсить запрос, но не позволяет заменить его части, он ведёт себя как иммутабельный тупл.
Можно написать код: протокол и хост соединяем через :// добавляем path если query не пустой, то добавляем его через '?' если хэш-тег (#fragment) не пустой, добавляем его через #
но вроде urllib уже умеет это делать, проблема только в передаче параметров - SplitResult.geturl требует на входе SplitResult, а я не могу собрать свой SplitResult! И я не уверен на 100% в том что я - корректно склею.
updated: в конце концов получилось что-то такое - http://dobrokot.ru/dump/user_friendly_url.py updated: конретно на заданный вопрос - ответ urlparse.urlunsplit, умудрился просмотреть его в документации (правда, мне понадобилась чуть более тонкая логика в склейке). Спасибо Andy Shevchenko-ядовитому!
|
|
| Скрипт для перекодировки текстовых файлов в кодировку по умолчанию |
[12 Apr 2012|06:49pm] |
|
В Линуксе для перекодирования текстовых файлов есть программа iconv, только вот она обрабатывает файлы по одному. Если надо обработать много файлов, то можно написать bash-скрипт, а можно создать свою собственную программу. Что я и сделал, и сейчас прошу участников сообщества оценить продукт моего творчества. Чтобы воспользоваться скриптом, надо указать два аргумента: кодировку исходных файлов и путь к папке, где эти файлы лежат.
#!/usr/bin/python3.2 #_*_coding: utf-8_*_ import os import codecs from locale import getlocale from sys import argv """ First argument must be encoding of source files. Second argument must be path to the files """ # Остановить выполнение скрипта, если # не указаны нужные параметры
if len (argv) < 2: exit() # Get the entered name of a source encoding # Имя кодировки считываемых фалов readingencode=argv[1] # Go to the working directory os.chdir(argv[2]) # Get the name of a default encoding # Системная кодировка default_encode=getlocale()[1] # Create the directory for new files # Создается папка для сохранения новых файлов writedir='%sfiles/' % default_encode os.mkdir(writedir) # Read the current directory # Считывается содержимое папки Lsdir=os.listdir() # Список, в который записываются имена читаемых файлов files=[] for file in Lsdir: if os.path.isdir(file) == False: files.append(file) for file in files: # Read data from the original file with the specified encoding readfile=codecs.open(file, encoding=readingencode) readlist=readfile.readlines() writefile=codecs.open(writedir + file, 'w', default_encode) # Write data to a new file with the default encoding for string in readlist: writefile.write(string + '\n') readfile.close() writefile.close()
P.S. В Windows этот скрипт не тестировался, поэтому, вполне возможно, Windows-пользователям придется что-то подкорректировать.
|
|
|
[11 Apr 2012|02:51pm] |
Добрый день, питон изучаю не так давно так что прошу ногами не пинать
вопрос возник
существует ли какой либо способ получить аналог php'шного $_SERVER['REQUEST_URI'] ??? желательно фреймворко независимый!
т.е. вот есть я так понимаю wsgiref.util.request_uri() но ей на вход нужен dict environ... вопрос... как этот самый dict правильно получить например в django/pylons/любой другой фреймворк умеющий WSGI?
|
|
| SQLObject 1.3.0 |
[31 Mar 2012|03:47pm] |
|
Выпущен SQLObject 1.3.0. Изменения:
- Драйвер Постгреса конвертирует исключения DB API в исключения SQLObject.
- Большое обновление драйвера Firebird, переписан и расширен код интроспекции.
Полный список новостей (на английском) можно посмотреть здесь: http://sqlobject.org/News.html.
SQLObject - это библиотека объектно-реляционного отображения. Каждая таблица представлена классом, каждая строка таблицы - экземпляром этого класса, каждая колонка (атрибут) - питоновским атрибутом. Библиотека SQLObject проста в использовании; не претендует на универсальность и всеохватность, но основные операции с SQL поддерживает. SQLObject работает со следующими БД: MySQL, PostgreSQL, SQLite, Firebird, Sybase, MSSQL и MaxDB (SAPDB). Работает с Python 2.4 по 2.7.
|
|
| PyCharm & curses |
[15 Mar 2012|01:35pm] |
может кто подскажет, есть ли возможность научить pycharm запускать код в другом окне терминала, а не в собственной console?
пробую кодить с urwid (для разработки интерфейса в консоли) и при запуске в консоли PyCharm-a естественно ничего не работает, а каждый раз кликать в соседний терминал и запускать там - не очень удобно :((
|
|
| установка pygame |
[04 Mar 2012|12:01am] |
работаю в Python 2.7.2
скачал отсюда стабильную версию 1.8.1, до этого поставил sdl-config и sdl-mpeg. При установке требуется куча зависимостей, типа libgcc, которые в свою очередь требуют других, итд, при этом sdl-config и sdl-mpeg почему-то не обнаруживаются. Что можно сделать? До этого пробовал поставить версию 1.9, которая этих зависимостей тоже не находила, оcобенно gcc
|
|
| Ищутся Python-developers и QA в СПб |
[27 Feb 2012|11:02pm] |
"Ищут пожарные, Ищет милиция, Ищут фотографы. В нашей столице, Ищут давно, Но не могут найти. Парня какого-то. Лет н-дцати" (c)
Очень и очень ищутся хорошие люди, которые станут участниками проекта omlet.ru
Две градации Python ( Junior и Senior ) и QA (те, кто помогут с качеством).
Вакансия Junior - описание Вакансии Senior и тамже - вакансия QA
Компания Стрим, дочернее предприятие МТС
Что мы предлагаем?
- Работу в большом и интересном проекте
- Офис - ст. метро Василеостровская + 5 минут ходьбы - и то прогулочным шагом
- Действительно неординарные задачи
- Полностью белое оформление и ЗП
- Повышенный отпуск - как компенсация за ненормированный рабочий день
- Корпоративную симку для связи
- После испытательного срока - ДМС
Резюме ожидаются на адрес michael_xiii()mail.ru . Кто сомневается - напишу корпоративный адрес в личке, спамботов кормить не хочу ;-)
Если кто-то перепостит - заранее большое спасибо!
|
|
| Vim+python |
[08 Dec 2011|10:06am] |
Небольшой видеоролик про редактирование кода в vim. Краткое содержание. 1. Использование аббревиатур. 2. Плагин MRU 3.Плагин tagbar Сделано с помощью свободного редактора OpenShot — для изготовления видеороликов в домашних условиях он оказался вполне пригоден. http://youtu.be/eagC7PcGcCk
|
|
|
[10 Feb 2012|09:23pm] |
Привет! Есть несколько структур данных, в которых хранятся обычные питонские словари, вида
{"a":1,"b":2}
Структуры разной сложности. Есть, например, просто словарь, который хранит эти маленькие словарики
{"key":{"a":1,"b":2},
"key1":{"a":10,"b":20}}
А есть и всякие сложные штуки типа:
["A",["B",[{"a":1,"b":2},{"a":10,"b":20}]],"A1",["B",[{"a":1,"b":2},{"a":10,"b":20}]]]
Все структуры создаются во время старта приложения. Словарики читаются из базы. Структуры содержат ссылки на эти словарики, так, например, {"a":1,"b":2} сидит ссылкой сразу в нескольких стуктурах. Во время создания очередной структуры выясняется, что словарик {"a":1,"b":2} больше не нужен. Его нужно вынести нах из всех структур где он уже участвует. Вопрос: как это лучше сделать? В смысле, чтоб не проходить заново все эти структуры. Думаю в сторону: сделать этот маленький словарик унаследованным от dict и в каждой коллекции совать ему что? указатель на эту коллекцию? метод, который вынесет этот словарик из нужной коллекции? Спасибо.
|
|
| EKBPY - конференция по Python - 10 февраля 2012 |
[31 Jan 2012|03:39pm] |
|
10 февраля 2012 года в Екатеринбурге пройдет EKBPY - Конференция для настоящих и будущих разработчиков на Python
Мероприятие обещает быть полезным как для опытных питонистов, так и для тех, кому интересен этот язык программирования, но пока нет практического опыта его применения.
Содержание конференции составляют 10 докладов и 3 мастер-класса от ведущих питонистов УрФО.
Стоимость участия: 1500 рублей с человека.
|
|
| 3 мелких патча для Skype4py |
[25 Jan 2012|07:00pm] |
http://phdru.name/Software/Python/#skype4py
- segfault.patch - инициализация GLib для предотвращения segfault;
- exec.patch - исправлено число параметров в вызове os.execlp для запуска Skype;
- systembus.patch - возможность переключиться на SystemBus вместо SessionBus в D-Bus;
- combined.patch - все 3 одним патчем.
|
|
| проблема с установкой matplotlib в python2.7.2 |
[24 Dec 2011|09:08pm] |
работаю в МакОС 10.6.8. Поставил в Эклипсе новый интерпретатор, 2.7.2, потом поставил matplotlib соответствующий, правда для МакОС 10.3. Вот получается при импорте этого модуля такая ерунда:
если обычную python-консоль запустить через arch -i386 python, то модуль импортируется полностью нормально (т.е. работает). Если же я это делаю через Эклипс или просто без arch, при import matplotlib или from matplotlib import * сообщений об ошибке не появляется, но из модуля не импортируется ничего толком. А вот если попытаться сделать что-то вроде import matplotlib.pyplot или import matplotlib.pylab, то появляется сообщение
no matchin architecture in universal wrapper
что говорит о конфликте версий. Соответственно, ничего не работает. Запуск arch -i386 ./eclipse не помог, переустановка интерпретатора и добавление matplotlib в forced builtins тоже. Модуль под 10.6.х я не нашёл. Что посоветуете?
|
|
| Job Proposal |
[22 Dec 2011|09:57am] |
|
International recruiting Company WORLD STAFF ® for the client is looking for highly qualified personnel. Our client is a professional software development consultancy Position: SENIOR PYTHON ENGINEER U519 – PE DUTIES: - To work on software architecture
- Design and actual implementation of different functional parts of web system
- To be able to advice on design
- To contribute to server side components of the system
REQUIREMENTS: - MS/BS degree in Computing Sciences or equivalent is preferred
- Upper intermediate level of English
- At least 2 years of experience in working with Python
- Strong OOP background
- Strong algorithmic skills
- Experience in architecture of complex systems
- Experience with Python and JavaScript frameworks
- Knowledge of design patterns, enterprise architecture and software engineering principles
- Experience with revision control and bug tracking systems
- Good communication skills and ability to deal with people
FOR CANDIDATES COMPANY OFFERS: - Challenging work in a stable company
- Participation in various and complex projects
- HIGH LEVEL OF INCOME depending on skills and experience + annual bonus
- Flexible working hours
- 24 days paid vacation
- Medical insurance
International Recruiting Company WORLD STAFF ® - 25 years in Europe.
|
|
| django, wsgi, пакеты и маршруты |
[17 Dec 2011|11:38pm] |
Товарищи настоящие сварщики, просветите меня, пожалуйста по поводу логики использования PYTHONPATH в django.
Предположим, есть проект в /home/user/projects/foo и в нём есть поддиректория bar, содержащая приложение от этого проекта.
Django, очевидно, хочет, чтобы в PYTHONPATH присутствовал маршрут к /home/user/projects, а не /home/user/projects/foo (например, потому что в генерируемом django-admin'ом файле settings.py ROOT_URLCONF выглядит как 'foo.urls', а не просто 'urls'.
Соответственно, чтобы проект заработал в wsgi-сервере, в wsgi-файл пишется что-то типа
sys.path.append('/home/user/projects') os.environ['DJANGO_SETTINGS_MODULE'] = 'foo.settings', это всё понятно, логично, и описано в официальной документации.
А вот с модулем bar возникает проблема: ссылки на его компоненты по имени самого модуля, без имени проекта, т.е. 'bar.views' (а не 'foo.bar.views') работают из встроенного веб-сервера (manage.py runserver), но не работают из wsgi. Вообще говоря, это логично: через PYTHONPATH его по короткому имени действительно найти невозможно. Но почему он тогда доступен из встроенного сервера?
И главный вопрос: каков идеологически правильный способ сделать его доступным из-под wsgi? Дописывать ко всем ссылкам на него префикс проекта - неудобно и нелогично. Добавить в PYTHONPATH ещё и /home/user/projects/foo? Это работает, но добавлять туда одновременно /home/user/projects и /home/user/projects/foo тоже кажется мне нелогичным.
Что скажут профессионалы?
|
|
| Кто тормозит - я, sqlite или django? [solved] |
[11 Dec 2011|12:03am] |
Создал в django минимально возможную модель из одного-единственного поля:
foo=models.IntegerField(primary_key=True). В базе получилось оно самое:CREATE TABLE "foo_foo" (
"foo" integer NOT NULL PRIMARY KEY
); Написал тестовую программку для загрузки данных из файла. Она проверяет, есть ли уже объект с таким значением (Foo.objects.get(foo=...)), если нет - создаёт и сохраняет в базу. При отключённой записи в базу программа летает, но стоит раскомментировать o.save() у свежесозданного объекта - начинаются дикие тормоза, на добавление одной записи уходит порядка секунды.
На чтение работает нормально: если программу прервать и запустить снова, то ранее загруженные записи она находит мгновенно, а на создании новых опять тормозит.
База пустая, там одна-единственная таблица, других приложений в проекте вообще нет. Удалять базу целиком и создавать заново пробовал, не помогает.
Вопрос: это sqlite по жизни такой тормозной, или django с ним как-то криво работает, или это я что-то не так делаю?
( на всякий случай некоторые технические подробности )
Upd: проблема была вызвана автокоммитами после каждого save(). Решается использованием декоратора @transaction.commit_manually для функции, внутри которой крутится цикл, и transaction.commit() в конце этой функции.
Но почему автокоммиты занимают столько времени, я всё равно не понимаю.
|
|
| Python на мобильном. |
[08 Dec 2011|05:08pm] |
Для некоторых смартфонов (android, Nokia) есть возможность запускать на них приложения на python. На остальных (blackberry например - только java) По крайней мере больше ничего не нашел.
Т.к. основное приложение на python, клиент тоже хотелось-бы писать на нем. Нужно иметь возможность выдать текст на экран, получить текст от пользователя (ввод с клавиатуры), получить/отправить данные по http (на мобильном - клиент) и (это было-бы шикарно) прочитать (записать) файл из памяти телефона. Т.е. простейшие вещи. А поддерживать код на 2 языках сразу не удобно.
Может есть конвертер какой python - java (именно для мобильного) или еще как? Может я не там ищу (т.к в гугле мало вразумительного)? Может не с той стороны подхожу к вопросу?
|
|
| navigation |
| [ |
viewing |
| |
most recent entries |
] |
| [ |
go |
| |
earlier |
] |
|
|
|
|